load("@rules_pkg//:pkg.bzl", "pkg_zip")
load(
    "@rules_pkg//:mappings.bzl",
    "pkg_attributes",
    "pkg_files",
)
load("//:protobuf_release.bzl", "package_naming")
load(":build_systems.bzl", "gen_file_lists")
load(":cc_dist_library.bzl", "cc_dist_library")

package_naming(
    name = "protobuf_pkg_naming",
)

pkg_files(
    name = "wkt_protos_files",
    srcs = [
        "//:well_known_type_protos",
        "//src/google/protobuf:descriptor_proto_srcs",
    ],
    prefix = "include/google/protobuf",
    visibility = ["//visibility:private"],
)

pkg_files(
    name = "compiler_plugin_protos_files",
    srcs = [
        "//src/google/protobuf/compiler:compiler_plugin_protos_files",
    ],
    prefix = "include/google/protobuf/compiler",
    visibility = ["//visibility:private"],
)

################################################################################
# Generates protoc release artifacts.
################################################################################

genrule(
    name = "protoc_readme",
    outs = ["readme.txt"],
    cmd = """
echo "Protocol Buffers - Google's data interchange format
Copyright 2008 Google Inc.
https://developers.google.com/protocol-buffers/
This package contains a precompiled binary version of the protocol buffer
compiler (protoc). This binary is intended for users who want to use Protocol
Buffers in languages other than C++ but do not want to compile protoc
themselves. To install, simply place this binary somewhere in your PATH.
If you intend to use the included well known types then don't forget to
copy the contents of the 'include' directory somewhere as well, for example
into '/usr/local/include/'.
Please refer to our official github site for more installation instructions:
  https://github.com/protocolbuffers/protobuf" > $@
    """,
    visibility = ["//visibility:private"],
)

genrule(
    name = "rename_protoc",
    srcs = ["//:protoc_static"],
    outs = ["bin/protoc"],
    cmd = "cp $< $@",
    tags = ["manual"],
)

genrule(
    name = "rename_protoc_exe",
    srcs = ["//:protoc_static"],
    outs = ["bin/protoc.exe"],
    cmd = "cp $< $@",
    tags = ["manual"],
)

pkg_files(
    name = "protoc_files",
    srcs = select({
        "//build_defs:config_win": ["bin/protoc.exe"],
        "//conditions:default": ["bin/protoc"],
    }),
    attributes = pkg_attributes(mode = "0555"),
    prefix = "bin/",
    visibility = ["//visibility:private"],
)

pkg_zip(
    name = "protoc_release",
    srcs = [
        ":compiler_plugin_protos_files",
        ":protoc_files",
        ":protoc_readme",
        ":wkt_protos_files",
    ],
    package_file_name = "protoc-{version}-{platform}.zip",
    package_variables = ":protobuf_pkg_naming",
)

################################################################################
# Generated file lists for build systems
################################################################################

gen_file_lists(
    name = "gen_src_file_lists",
    testonly = 1,
    out_stem = "src_file_lists",
    src_libs = {
        # {[source rule]: [name in generated file]}
        # Libraries:
        ":protobuf": "libprotobuf",
        ":protobuf_lite": "libprotobuf_lite",
        ":protoc": "libprotoc",
        # Protos:
        "//src/google/protobuf:well_known_type_protos": "wkt_protos",
        "//src/google/protobuf:cpp_features_proto": "cpp_features_proto",
        "//src/google/protobuf:descriptor_proto": "descriptor_proto",
        "//src/google/protobuf/compiler:plugin_proto": "plugin_proto",
        "//java/core:java_features_proto": "java_features_proto,src/google/protobuf/compiler/java/",

        # Test libraries:
        ":common_test": "common_test",
        ":lite_test_util": "lite_test_util",
        ":test_util": "test_util",
        # Tests and test-only protos:
        "//src/google/protobuf:full_test_srcs": "protobuf_test",
        "//src/google/protobuf:test_proto_all_srcs": "protobuf_test_protos",
        "//src/google/protobuf:lite_test_srcs": "protobuf_lite_test",
        "//src/google/protobuf:lite_test_proto_srcs": "protobuf_lite_test_protos",
        "//src/google/protobuf/compiler:fake_plugin_srcs": "fake_plugin",
        "//src/google/protobuf/compiler:test_srcs": "compiler_test",
        "//src/google/protobuf/compiler:test_proto_srcs": "compiler_test_protos",
        "//src/google/protobuf/compiler:test_plugin_srcs": "test_plugin",
        "//src/google/protobuf/io:test_srcs": "io_test",
        "//src/google/protobuf/util:test_srcs": "util_test",
        "//src/google/protobuf/util:test_proto_srcs": "util_test_protos",
        "//src/google/protobuf/stubs:test_srcs": "stubs_test",
    },
)

################################################################################
# Protobuf runtime libraries.
################################################################################

cc_dist_library(
    name = "protobuf_lite",
    linkopts = select({
        "//build_defs:config_msvc": [],
        "//conditions:default": ["-lpthread"],
    }),
    tags = ["manual"],
    deps = [
        "//src/google/protobuf:arena_align",
        "//src/google/protobuf:protobuf_lite",
    ],
)

cc_dist_library(
    name = "protobuf",
    linkopts = select({
        "//build_defs:config_msvc": [],
        "//conditions:default": [
            "-lz",
            "-lpthread",
        ],
    }),
    tags = ["manual"],
    deps = [
        "//src/google/protobuf:arena_align",
        "//src/google/protobuf:cmake_wkt_cc_proto",
        "//src/google/protobuf:protobuf_nowkt",
        "//src/google/protobuf/compiler:importer",
        "//src/google/protobuf/json",
        "//src/google/protobuf/util:delimited_message_util",
        "//src/google/protobuf/util:differencer",
        "//src/google/protobuf/util:field_mask_util",
        "//src/google/protobuf/util:json_util",
        "//src/google/protobuf/util:time_util",
        "//src/google/protobuf/util:type_resolver_util",
    ],
)

cc_dist_library(
    name = "protoc",
    dist_deps = [
        ":protobuf",
        ":protobuf_lite",
    ],
    tags = ["manual"],
    deps = [
        "//src/google/protobuf/compiler:command_line_interface",
        "//src/google/protobuf/compiler/cpp",
        "//src/google/protobuf/compiler/csharp",
        "//src/google/protobuf/compiler/java",
        "//src/google/protobuf/compiler/objectivec",
        "//src/google/protobuf/compiler/php",
        "//src/google/protobuf/compiler/python",
        "//src/google/protobuf/compiler/ruby",
        "//src/google/protobuf/compiler/rust",
    ],
)

cc_dist_library(
    name = "lite_test_util",
    testonly = 1,
    dist_deps = [":protobuf"],
    tags = ["manual"],
    deps = ["//src/google/protobuf:lite_test_util"],
)

cc_dist_library(
    name = "test_util",
    testonly = 1,
    dist_deps = [
        ":common_test",
        ":lite_test_util",
        ":protoc",
        ":protobuf",
        ":protobuf_lite",
    ],
    tags = ["manual"],
    deps = [
        "//src/google/protobuf:lite_test_util",
        "//src/google/protobuf:test_util",
        "//src/google/protobuf:test_util2",
        "//src/google/protobuf/compiler:annotation_test_util",
        "//src/google/protobuf/compiler/cpp:unittest_lib",
        "//src/google/protobuf/io:test_zero_copy_stream",
    ],
)

cc_dist_library(
    name = "common_test",
    testonly = 1,
    dist_deps = [
        ":protobuf",
        ":protobuf_lite",
        ":protoc",
    ],
    tags = ["manual"],
    deps = [
        "//src/google/protobuf:internal_visibility_for_testing",
        "//src/google/protobuf:test_textproto",
        "//src/google/protobuf/compiler:command_line_interface_tester",
        "//src/google/protobuf/compiler:mock_code_generator",
        "//src/google/protobuf/testing",
    ],
)
